iT邦幫忙

0

Kotlin中SharedFlow的emit與tryEmit有什麼差別

  • 分享至 

  • xImage
  •  

如果當你在ViewModel中宣告一個SharedFlow

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-shared-flow/

val shareFlow = MutableShareFlow<Int>()

在使用時候你會發現emit是一個suspend function ,所以都必須透過coroutineScope來呼叫

class MyViewModel: ViewModel{
    val shareFlow = MutableShareFlow<Int>()
    fun test() {
        viewModelScope.launch {
            shareFlow.emit(3)
        }
    }
}

然後你會發現,他其實有一個tryEmit,而且還不需要透過coroutineScope來執行,這樣不是超級方便的嗎,少寫很多行

結果你發現你改寫這樣後

class MyViewModel: ViewModel{
    val shareFlow = MutableShareFlow<Int>()
    fun test() {        
        shareFlow.tryEmit(3)        
    }
}

居然就沒反應了,先說結果,其實你誤用tryEmit這個funciton了

根據說明

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.flow/-mutable-shared-flow/try-emit.html

tryEmit 其實他是當下讓你用來測試當下是否能夠進行emit,如果buffer已經滿了,他回透過回傳boolean來告訴你,你可以藉著進行一些處理

因此不要會誤以為tryEmit就是一個不需要加上coroutineScope的方法。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言